package serverSide;

import genclass.GenericIO;

/**
 *   Este tipo de dados simula uma solução do lado do servidor do Problema dos Barbeiros Sonolentos que implementa o
 *   modelo cliente-servidor de tipo 2 (replicação do servidor) com lançamento estático dos threads barbeiro.
 *   A comunicação baseia-se em passagem de mensagens sobre sockets usando o protocolo TCP.
 */
public class ServerSleepingBarbers {

    /**
     *  Número do port de escuta do serviço a ser prestado (4000, por defeito)
     *
     *    @serialField portNumb
     */
    private static final int portNumbS = 4000; //Servidor Loja
    private static final int portNumbWS = 4001; //Servidor Oficina
    private static final int portNumbGS = 4002; // Servidor General State
    private static final int portLogger = 4003; // Servidor Logger

    /**
     *  Programa principal.
     */
    public static void main(String[] args) {
        StoreMonitor store;                                    // loja (representa o serviço a ser prestado)
        WorkshopMonitor workshop;                              // oficina (reperesenta o serviço a ser prestado)
        GeneralState gstate;                                   // estadoGeral (representa o serviço a ser prestado)
        StoreMonitorInterface shopInter;                      // interface à barbearia
        WorkshopMonitorInterface wshopInter;
        GeneralStateInterface gsInter;

        ServerCom sconS, sconWS, sconGS, sconi;                               // canais de comunicação
        ClientProxy cliProxy;                                // thread agente prestador do serviço

        /* estabelecimento do servico */

        sconS = new ServerCom(portNumbS);                     // criação do canal de escuta e sua associação
        sconWS = new ServerCom(portNumbWS);
        sconGS = new ServerCom(portNumbGS);

        sconS.start();                                       // com o endereço público
        sconWS.start();
        sconGS.start();

        store = new StoreMonitor();                           // activação do serviço
        shopInter = new StoreMonitorInterface(store);        // activação do interface com o serviço
        GenericIO.writelnString("O serviço LOJA foi estabelecido!");
        GenericIO.writelnString("O servidor LOJA esta em escuta.");

        workshop = new WorkshopMonitor();                           // activação do serviço
        wshopInter = new WorkshopMonitorInterface(workshop);        // activação do interface com o serviço
        GenericIO.writelnString("O serviço OFICINA foi estabelecido!");
        GenericIO.writelnString("O servidor OFICINA esta em escuta.");

        gstate = new GeneralState();
        gsInter = new GeneralStateInterface(gstate);
        GenericIO.writelnString("O serviço GSTATE foi estabelecido!");
        GenericIO.writelnString("O servidor GSTATE esta em escuta.");

        /* processamento de pedidos */

        while (true) {
            sconi = sconS.accept();                            // entrada em processo de escuta
            cliProxy = new ClientProxy(sconi, bShopInter);    // lançamento do agente prestador do serviço
            cliProxy.start();
        }
    }
}
